/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ru.bfpro.blocksolution;
/**
 *
 * @author fbn
 */
public class Figure {
    private Figure_Cell[] cells;
    private int [][] pcs;
    private Figure_Cell [][] cell_place;
    private int pcs_maxX;
    private int pcs_maxY;
    private int number;
    private int weight;
    
    /**
     * Создание фигуры с заданными размерами
     * @param n Порядковый номер фигуры
     * @param _x количество блоков по ширине (макс.)
     * @param _y количество блоков по высоте (макс.)
     */
    public Figure(int n,int _x, int _y) {
        number = n;
        pcs_maxX = _x;
        pcs_maxY = _y;
        cells = new Figure_Cell[_x*_y];
        cell_place = new Figure_Cell[_y][_x];
        weight = 0;
    }
    /**
     * @return the pcs
     */
    public int[][] getPcs() {
        return pcs;
    }

    /**
     * @param pcs the pcs to set
     */
    public void setPcs(int [][] pcs) {
        this.pcs = pcs;
        int i = 0;
        for (int y=0; y<pcs.length; y++) {
            for (int x=0; x<pcs[y].length; x++ ) {
                Figure_Cell cell = new Figure_Cell(x, y, (pcs[y][x] == 1));
                cells[i] = cell;
                i++;
                cell_place[y][x] = cell;
            }
        }
    }

    /**
     * @return the pcs_maxX
     */
    public int getPcs_maxX() {
        return pcs_maxX;
    }

    /**
     * @param pcs_maxX the pcs_maxX to set
     */
    public void setPcs_maxX(int pcs_maxX) {
        this.pcs_maxX = pcs_maxX;
    }

    /**
     * @return the pcs_maxY
     */
    public int getPcs_maxY() {
        return pcs_maxY;
    }

    /**
     * @param pcs_maxY the pcs_maxY to set
     */
    public void setPcs_maxY(int pcs_maxY) {
        this.pcs_maxY = pcs_maxY;
    }

    /**
     * @return the Cells
     */
    public Figure_Cell[] getCells() {
        return cells;
    }

    /**
     * @param Cells the Cells to set
     */
    public void setCells(Figure_Cell[] Cells) {
        this.cells = Cells;
    }
    
    /**
     * Отрисовка фигуры
     */
    public void Paint() {
        int y = 0;
        System.out.println("Figure: "+ this.getNumber());        
        for (int i=0;i<this.cells.length;i++){
            if (y != this.cells[i].fig_y) {
                System.out.println();
                y = this.cells[i].fig_y;
            } 
            System.out.print(this.cells[i].fill == true ? "[*]" : "[ ]" );
        }
        System.out.println();        
    }

    /**
     * @return the "weight" of figure
     */
    public int getWeight() {
        if (weight != 0) {
            return weight;
        } else
        {
            // 1. Определить количество ячеек фигуры
            for (int i=0;i<this.cells.length;i++){
                if (this.cells[i].fill == true) weight++;
            }
            weight = weight * 4;
            // 2. Определить количество общих границ между ячейками
            int i = 0;
            for (int y=0; y<pcs.length; y++) {
                for (int x=0; x<pcs[y].length; x++ ) {
                    if (pcs[y][x] == 1) {
                        if (pcs_maxX > 1) {
                            // Только если больше одного столбца
                            if (x==0) {
                                // первый столбец, смотрим только вправо
                                if (pcs[y][x+1] == 1) i++;
                            } else if (x==pcs_maxX-1) {
                                // последний столбец, смотрис только влево
                                if (pcs[y][x-1] == 1) i++;
                            } else {
                                // смотрим и слева и справа
                                if (pcs[y][x-1] == 1) i++;
                                if (pcs[y][x+1] == 1) i++;
                            }
                        }
                        if (pcs_maxY > 1) {
                            // Только если больше одной строки
                            if (y==0) {
                                // первая строка, смотрим только вниз
                                if (pcs[y+1][x] == 1) i++;
                            } else if (y==pcs_maxY-1) {
                                // последяя строка, смотрим только вверх
                                if (pcs[y-1][x] == 1) i++;
                            } else {
                                // смотрим и сверху и снизу
                                if (pcs[y-1][x] == 1) i++;
                                if (pcs[y+1][x] == 1) i++;
                            }
                        }

                    }
                }
            }
            //System.out.println("Общих границ:" + i);        
            weight = weight - i;
            return weight;
        }
    }

    /**
     * @return the number
     */
    public int getNumber() {
        return number;
    }

    /**
     * @return the cell_place
     */
    public Figure_Cell[][] getCell_place() {
        return cell_place;
    }

    /**
     * @param cell_place the cell_place to set
     */
    public void setCell_place(Figure_Cell[][] cell_place) {
        this.cell_place = cell_place;
    }
    
}
